package cn.ztelovecly.springboot.framework.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 */
public class MapUtil {

    /**
     * 转换一个列表为Map,可以指定key
     * @param list         要转换的列表
     * @param fieldName    key对应的属性名称
     * @return             Map
     * @throws NoSuchFieldException     未找到指定的属性
     * @throws NoSuchMethodException    未找到指定属性的getter方法
     */
    @SuppressWarnings("unchecked")
    public static <K,V> Map<K, V> transferList(List<V> list, String fieldName) throws NoSuchFieldException, NoSuchMethodException {
        if(list == null) {
            throw new NullPointerException("传入的对象列表<list>不能为空");
        }
        if(fieldName == null || fieldName.equals("")) {
            throw new NullPointerException("要匹配的字段名不能为空");
        }
        if(list.size() == 0) {
            System.out.println(MapUtil.class.getName() + "：getHashMap（List,String,List） 传入的对象列表没有值");
            return new HashMap<>();
        }

        V v = list.get(0);
        Class clazz = v.getClass();
        Method method ;
        try {
            method = clazz.getMethod("get" + StringUtil.upperFirstWord(fieldName));
        } catch (NoSuchMethodException e) {
            throw new NoSuchMethodException("未找到为" + fieldName + "定义的getter方法。" +
                    "请检查" + clazz.getName() + "类中是否有 get" + StringUtil.upperFirstWord(fieldName) + "方法");
        }

        //把所有的结果加入Map中
        Map<K, V> map = new HashMap<>();
        for(V temp : list) {
            K id = null;
            try {
                id = (K)method.invoke(temp);
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
            map.put(id, temp);
        }
        return map;
    }
}
